using SN.WebApi.Redis;

namespace SN.WebApi.Commons;

public class RedisIdWorker
{

    // 当前时间距离1970 年 1 月 1 日 00:00:00 UTC的秒数
    private static readonly long BEGIN_TIMESTAMP = 1640995200l;
    // 序列号位数
    private static readonly int COUNT_BITS = 32;
    /// <summary>
    /// redis实现唯一id
    /// </summary>
    /// <returns></returns>
    public static long NextId(string keyPrefix){
        // 符号位 + 时间戳（31） + 序号列（32）
        // 259510445239435260
        // 11 - 10011001 11110111 01011111 - 1111 1111 1111 1111 1111 1111 1111 1100
        // 1 生成时间戳
        DateTime currentTime = DateTime.Now;
         // 获取当前时间的时间戳（秒数）
        long nowSecond = (long)(currentTime - new DateTime(1970, 1, 1)).TotalSeconds;
        long timestamp = nowSecond - BEGIN_TIMESTAMP;

        // 2 生成序列号
        var db = RedisHelper.RedisConn.GetDatabase();
        // 2.1 获取当前时间
        var date = DateTime.Now.ToString("yyyy-MM-dd");
        // 2.2 自增长
        long count = db.StringIncrement($"icr:{keyPrefix}:{date}");

        // 3 拼成并返回 
        // 3.1 时间戳左移32位，后面的用 | 得到的值跟count保持一致。
        return timestamp << COUNT_BITS | count;

    }
}
